package com.decheng.pojo;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 孔德成
 * @Slogan 致敬大师，致敬未来的你
 * @desc 购物车类
 */
public class Cart {
    /**
     * 存储购物车中的购物项
     * 以购物项中的书的ID作为key，以购物项作为value
     */
    private Map<Integer, CartItem> cartItemMap = new HashMap<>();


    /**
     * 将书添加进购物车
     */
    public void addBookToCart(Book book) {
        // 1. 判断购物车中是否有这件商品
        if (cartItemMap.containsKey(book.getBookId())) {
            // 有这件商品，将其数量加1
            itemCountIncrease(book.getBookId());
        } else {
            // 如果没有，就新增一个购物项
            CartItem cartItem = new CartItem();
            cartItem.setBookId(book.getBookId());
            cartItem.setBookName(book.getBookName());
            cartItem.setImgPath(book.getImgPath());
            // 第一次添加，数量为1
            cartItem.setCount(1);
            cartItem.setPrice(book.getPrice());
            // 第一次添加，总价就是单价
            cartItem.setAmount(book.getPrice());
            // 将购物项添加到购物车中
            cartItemMap.put(book.getBookId(), cartItem);
        }
    }

    /**
     * 将购物车中的某个购物项的数量+1
     *
     * @param bookId
     */
    public void itemCountIncrease(Integer bookId) {
        // 根据 id 从 map中取出 购物项
        // 调用 购物项的 countIncrease 方法
        cartItemMap.get(bookId).countIncrease();
    }

    /**
     * 将购物车中的某个购物项的数量-1
     *
     * @param bookId
     */
    public void itemCountDecrease(Integer bookId) {
        CartItem cartItem = cartItemMap.get(bookId);
        // 1. 将当前数量减一
        cartItem.countDecrease();
        // 2. 判断数量是否为0，如果为0，需要移除购物项
        if (cartItem.getCount() == 0) {
            removeCartItem(bookId);
        }
    }

    /**
     * 从购物车中移除购物项
     *
     * @param bookId
     */
    public void removeCartItem(Integer bookId) {
        cartItemMap.remove(bookId);
    }

    /**
     * 修改某个购物项的数量
     *
     * @param bookId
     */
    public void updateItemCount(Integer bookId, Integer newCount) {
        cartItemMap.get(bookId).setCount(newCount);
    }

    /**
     * 获取购物车中的购物项中的商品的总数
     * 就是将所有购物项的count进行累加
     *
     * @return
     */
    public Integer getTotalCount() {
        Integer totalCount = 0;
        for (Map.Entry<Integer, CartItem> cartItemEntry : cartItemMap.entrySet()) {
            totalCount += cartItemEntry.getValue().getCount();
        }
        return totalCount;
    }

    /**
     * 获取总金额
     * 就是遍历出每个购物项的金额再累加
     *
     * @return
     */
    public Double getTotalAmount() {
        // 解决精度问题的核心: 就是将要进行运算的数据转成BigDecimal类型之后再计算
        // 创建BigDecimal类型对象时将Double类型的数据转换为字符串
        BigDecimal totalAmount = new BigDecimal("0.0");
        for (Map.Entry<Integer, CartItem> cartItemEntry : cartItemMap.entrySet()) {
            // 将double类型的计算结果转为字符串
            String s = cartItemEntry.getValue().getAmount() + "";
            totalAmount = totalAmount.add(new BigDecimal(s));
        }
        return totalAmount.doubleValue();
    }

    /**
     * 显示购物车信息,为了在Thymeleaf中便于使用OGNL表达式获取购物车的信息，
     * 我们的方法名要叫作getCartItemMap(),那么我们在Thymeleaf中就可以使用 .cartItemMap获取
     *
     * @return
     */
    public Map<Integer, CartItem> getCartItemMap() {
        return cartItemMap;
    }

    public void setCartItemMap(Map<Integer, CartItem> cartItemMap) {
        this.cartItemMap = cartItemMap;
    }

    @Override
    public String toString() {
        return "Cart{" +
                "cartItemMap=" + cartItemMap +
                '}';
    }
}
